/* 
 * Service.java
 * 
 * Data de criação: 12/02/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.core.service;

import java.io.Serializable;
import java.util.List;

import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.o2solutions.core.exception.BusinessException;

/**
 * Interface que define todos os serviços providos pelo Sistema. Serve como
 * fachada para as operações negociais e controle de transações.
 * 
 * @param <T>
 *            Tipo da Entidade referencia para o servico
 * @author osvaldeir
 * @since 12/02/2010
 * 
 */
@Transactional(readOnly = true)
public interface Service<T> {

	/**
	 * Persiste na base de Dados uma entidade do sistema.
	 * 
	 * @param entity
	 *            Entidade a ser persistida
	 * @throws BusinessException
	 *             Caso alguma regra negocial seja rompida. Ver pacote rule.
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void save(T entity) throws BusinessException;

	/**
	 * Atualiza na base de Dados uma entidade do sistema.
	 * 
	 * @param entity
	 *            Entidade a ser atualizada
	 * @throws BusinessException
	 *             Caso alguma regra negocial seja rompida. Ver pacote rule.
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void update(T entity) throws BusinessException;

	/**
	 * Remove da base de dados uma entidade.
	 * 
	 * @param entity
	 *            Entidade a ser removida
	 * @throws BusinessException
	 *             Caso alguma regra negocial seja rompida. Ver pacote rule.
	 */
	@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
	public void remove(T entity) throws BusinessException;

	/**
	 * Retorna a lista de todas as Entidades cadastradas no sistema a partir do
	 * tipo
	 * 
	 * Tipo das Entidades
	 * 
	 * @param <T>
	 *            Classe indicadora do tipo
	 * @return List<T>
	 */
	public List<T> findAll();

	/**
	 * Retorna a lista de Entidades cadastradas de acordo com o Objeto criterio
	 * de pesquisa
	 * 
	 * @param entity
	 * @return List<T>
	 */
	public List<T> findByCriterio(T entity);

	/**
	 * Retorna a Entidade pelo seu ID
	 * 
	 * @param <T>
	 *            Classe indicadora do tipo
	 * 
	 * @param id
	 *            Id da Entidade a ser pesquisada
	 * @return T Entidade
	 */
	public T findById(Serializable id);

}
